package com.odontosis.view.cadastro.paciente;

import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Date;
import java.util.Iterator;
import java.util.List;

import javax.servlet.http.HttpServletRequest;

import org.apache.struts.action.ActionErrors;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.ActionMessage;
import org.apache.struts.action.ActionMessages;

import com.odontosis.acesso.filtro.PermissaoAcesso;
import com.odontosis.entidade.EstadoCivil;
import com.odontosis.entidade.OdontosisBusinessObject;
import com.odontosis.entidade.Paciente;
import com.odontosis.entidade.Sexo;
import com.odontosis.entidade.SituacaoPaciente;
import com.odontosis.entidade.TipoServico;
import com.odontosis.util.StringUtilsOdontosis;
import com.odontosis.view.OdontosisForm;

public class FormInclusaoPacientes extends OdontosisForm {

	private static final long serialVersionUID = 1L;

	private String nome;
	private String dataNascimento1;
	private String numResidencial;
	private String apResidencial;
	private String bairroResidencial;
	private String foneResidencial;
	private String celResidencial;
	private String indicacao;
	private String ruaResidencial;
	private String ipsm;
	private String cidadeResidencial;
	private String ufResidencial;
	private String cepResidencial;
	private String ruaComercial;
	private String numComercial;
	private String apComercial;
	private String bairroComercial;
	private String cidadeComercial;
	private String foneComercial;
	private String cepComercial;
	private String ufComercial;
	private String numeroPasta;
	private String nomepai;
	private String nomemae;
	private String email;
	private String pasta;
	private String matricula; 
	
	private String estadocivil1;
	private String sexo1; 
	private boolean adm;
	private boolean virNoRelatorioOld;
	private boolean virNoRelatorio;	
	
	

	public List<String> erros;

	public List<SituacaoPaciente> getColecaoSituacaoPaciente() {
		return Arrays.asList(SituacaoPaciente.values());
	}

	public Collection<String> getErros(){
		if(erros == null){
			return new ArrayList<String>();
		}
		return erros;
	}

	public void setErros(List<String> erros) {
		this.erros = erros;
	}
	
	public Sexo[] getColecaoSexo(){
		return Sexo.values();
	}

	@Override
	public ActionErrors validate(ActionMapping mapping,
			HttpServletRequest request) {
		ActionErrors errors = new ActionErrors();
		ActionMessages messages = new ActionMessages();
		
		if(StringUtilsOdontosis.isVazia(getNome())){
			messages.add("nome", new ActionMessage("O campo Nome do Paciente deve ser informado."));
		}
		if(StringUtilsOdontosis.isVazia(getDataNascimento1())){
			messages.add("datanascimento", new ActionMessage("O campo Data de Nascimento deve ser informado."));
		}else if(!StringUtilsOdontosis.isDateValid(getDataNascimento1())){
			messages.add("datanascimento", new ActionMessage("O campo Data de Nascimento não contém uma data válida do tipo dd/mm/aaaa."));
		}
//		if(StringUtilsOdontosis.isVazia(getSexo1())){
//			messages.add("sexo", new ActionMessage("O campo Sexo deve ser preenchido."));
//		}
//		if(StringUtilsOdontosis.isVazia(getEstadocivil1())){
//			messages.add("estadocivil1", new ActionMessage("O campo Estado Civil deve ser informado."));
//		}
		if(StringUtilsOdontosis.isVazia(getRuaResidencial()) || StringUtilsOdontosis.isVazia(getNumResidencial()) || StringUtilsOdontosis.isVazia(getBairroResidencial()) || StringUtilsOdontosis.isVazia(getUfResidencial()) || StringUtilsOdontosis.isVazia(getCidadeResidencial())) {
			messages.add("endereco", new ActionMessage("Os campos de Dados Residenciais marcados com '*' devem ser preenchidos."));
		}
		
		if(StringUtilsOdontosis.isVazia(getFoneResidencial()) && StringUtilsOdontosis.isVazia(getCelResidencial())){
			messages.add("telefone", new ActionMessage("Um dos campos telefone deve ser informado."));
		}
		

		if (messages.size() > 0 && getMetodo() != null) {
			errors.add(messages);
			erros = new ArrayList<String>();
			for (Iterator iterator = messages.get(); iterator.hasNext();) {
				ActionMessage string = (ActionMessage) iterator.next();
				erros.add(string.getKey());
			}
			request.setAttribute("mensagens", erros);
			return errors;
		} else {
			request.setAttribute("mensagens", null);
			return super.validate(mapping, request);
		}

	}

	public List<TipoServico> getColecaoTipoServico() {
		return Arrays.asList(TipoServico.values());
	}

	public List<EstadoCivil> getColecaoEstadoCivil(){
		return Arrays.asList(EstadoCivil.values());
	}
	
	
	@Override
	public void transferirParaBOs(OdontosisForm form,
			OdontosisBusinessObject... businessObjects)
			throws IllegalAccessException, InvocationTargetException {
		super.transferirParaBOs(form, businessObjects);
		FormInclusaoPacientes formulario = (FormInclusaoPacientes) form;
		Paciente paciente = (Paciente) businessObjects[0]; 	
		if(!StringUtilsOdontosis.isVazia(formulario.getSexo1())) {
			paciente.setSexo(Sexo.recuperarPorCodigo(Integer.parseInt(formulario.getSexo1())));
		} else {
			paciente.setSexo(null);
		}
		
		if(!StringUtilsOdontosis.isVazia(formulario.getEstadocivil1())) {
			paciente.setEstadocivil(EstadoCivil.recuperarPorCodigo(Integer.parseInt(formulario.getEstadocivil1())));
		} else {
			paciente.setEstadocivil(null);
		}
		if(!isAdm()) {			
			boolean boolean2 = formulario.isVirNoRelatorioOld();
			paciente.setVirNoRelatorio(boolean2);
		} else {
			boolean boolean3 = formulario.isVirNoRelatorio();
			paciente.setVirNoRelatorio(boolean3);
		}
		paciente.setDataNascimento(StringUtilsOdontosis.StringToDate(formulario.getDataNascimento1()));
		if(paciente.getDataCadastro() == null){
			paciente.setDataCadastro(new Date());
		}
		paciente.setId(formulario.getId());
		
	}

	@Override
	public void transferirParaForm(OdontosisForm form,
			OdontosisBusinessObject... businessObjects)
			throws IllegalAccessException, InvocationTargetException {
		super.transferirParaForm(form, businessObjects);
		FormInclusaoPacientes formulario = (FormInclusaoPacientes) form;
		Paciente paciente = (Paciente) businessObjects[0];
		formulario.setDataNascimento1(StringUtilsOdontosis.DateToString(paciente.getDataNascimento()));
		if(paciente.getSexo() != null ) {
			formulario.setSexo1(paciente.getSexo().getId().toString());
		} else {
			formulario.setSexo1(null);
		}
		formulario.setVirNoRelatorio(paciente.isVirNoRelatorio());
		formulario.setVirNoRelatorioOld(paciente.isVirNoRelatorio());
		formulario.setEstadocivil1(paciente.getEstadocivil() != null ? paciente.getEstadocivil().getId().toString(): null);
		formulario.setId(paciente.getId());
	}

	/***Getters and Setters*******/
	public String getIndicacao() {
		return indicacao;
	}

	public String getRuaResidencial() {
		return ruaResidencial;
	}

	public String getNumResidencial() {
		return numResidencial;
	}

	public String getApResidencial() {
		return apResidencial;
	}

	public String getBairroResidencial() {
		return bairroResidencial;
	}

	public String getCidadeResidencial() {
		return cidadeResidencial;
	}

	public String getUfResidencial() {
		return ufResidencial;
	}

	public String getFoneResidencial() {
		return foneResidencial;
	}

	public String getCelResidencial() {
		return celResidencial;
	}

	public String getCepResidencial() {
		return cepResidencial;
	}

	public String getRuaComercial() {
		return ruaComercial;
	}

	public String getNumComercial() {
		return numComercial;
	}

	public String getApComercial() {
		return apComercial;
	}

	public String getBairroComercial() {
		return bairroComercial;
	}

	public String getCidadeComercial() {
		return cidadeComercial;
	}

	public String getFoneComercial() {
		return foneComercial;
	}

	public String getCepComercial() {
		return cepComercial;
	}

	public String getUfComercial() {
		return ufComercial;
	}

	public String getSexo1() {
		return sexo1;
	}

	public String getDataNascimento1() {
		return dataNascimento1;
	}

	public String getNome() {
		return nome;
	}

	public String getNumeroPasta() {
		return numeroPasta;
	}

	public String getIpsm() {
		return ipsm;
	}

	public void setIndicacao(String indicacao) {
		this.indicacao = indicacao;
	}

	public void setRuaResidencial(String ruaResidencial) {
		this.ruaResidencial = ruaResidencial;
	}

	public void setNumResidencial(String numResidencial) {
		this.numResidencial = numResidencial;
	}

	public void setApResidencial(String apResidencial) {
		this.apResidencial = apResidencial;
	}

	public void setBairroResidencial(String bairroResidencial) {
		this.bairroResidencial = bairroResidencial;
	}

	public void setCidadeResidencial(String cidadeResidencial) {
		this.cidadeResidencial = cidadeResidencial;
	}

	public void setUfResidencial(String ufResidencial) {
		this.ufResidencial = ufResidencial;
	}

	public void setFoneResidencial(String foneResidencial) {
		this.foneResidencial = foneResidencial;
	}

	public void setCelResidencial(String celResidencial) {
		this.celResidencial = celResidencial;
	}

	public void setCepResidencial(String cepResidencial) {
		this.cepResidencial = cepResidencial;
	}

	public void setRuaComercial(String ruaComercial) {
		this.ruaComercial = ruaComercial;
	}

	public void setNumComercial(String numComercial) {
		this.numComercial = numComercial;
	}

	public void setApComercial(String apComercial) {
		this.apComercial = apComercial;
	}

	public void setBairroComercial(String bairroComercial) {
		this.bairroComercial = bairroComercial;
	}

	public void setCidadeComercial(String cidadeComercial) {
		this.cidadeComercial = cidadeComercial;
	}

	public void setFoneComercial(String foneComercial) {
		this.foneComercial = foneComercial;
	}

	public void setCepComercial(String cepComercial) {
		this.cepComercial = cepComercial;
	}

	public void setUfComercial(String ufComercial) {
		this.ufComercial = ufComercial;
	}

	public void setSexo1(String sexo) {
		this.sexo1 = sexo;
	}

	public void setDataNascimento1(String dataNascimento) {
		this.dataNascimento1 = dataNascimento;
	}

	public void setNome(String nome) {
		this.nome = nome;
	}

	public void setNumeroPasta(String numeroPasta) {
		this.numeroPasta = numeroPasta;
	}

	public void setIpsm(String ipsm) {
		this.ipsm = ipsm;
	}

	public String getNomepai() {
		return nomepai;
	}

	public String getNomemae() {
		return nomemae;
	}

	public String getEstadocivil1() {
		return estadocivil1;
	}

	public void setNomepai(String nomepai) {
		this.nomepai = nomepai;
	}

	public void setNomemae(String nomemae) {
		this.nomemae = nomemae;
	}

	public void setEstadocivil1(String estadocivil) {
		this.estadocivil1 = estadocivil;
	}

	public String getEmail() {
		return email;
	}

	public void setEmail(String email) {
		this.email = email;
	}	
	
	public String getPasta(){
		return StringUtilsOdontosis.isVazia(getNumeroPasta())? "Não Possui" : getNumeroPasta();
	}
	
	public void setPasta(String a) {
		
	}

	public boolean isAdm() {
		return adm;
	}

	public void setAdm(boolean adm) {
		this.adm = adm;
	}

	public boolean isVirNoRelatorioOld() {
		return virNoRelatorioOld;
	}

	public boolean isVirNoRelatorio() {
		return virNoRelatorio;
	}

	public void setVirNoRelatorioOld(boolean virNoRelatorioOld) {
		this.virNoRelatorioOld = virNoRelatorioOld;
	}

	public void setVirNoRelatorio(boolean virNoRelatorio) {
		this.virNoRelatorio = virNoRelatorio;
	}

	public String getMatricula() {
		return matricula;
	}

	public void setMatricula(String matricula) {
		this.matricula = matricula;
	}

	


}
